from .base_webdriver import BaseWebDriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import Select, WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException
import time


class DeviceUI(BaseWebDriver):
    """
    设备管理模块，负责处理设备相关操作
    """
    def __init__(self):
        super().__init__()

    def add_device_model(self, devType, name, desc):
        """
        添加设备型号
            devType (str): 设备类型
            name (str): 设备型号名称
            desc (str): 设备描述
        """
        # 使用基类提供的显式等待实例
        wait = self.wait

        # 等待设备类型下拉框可点击
        device_type = wait.until(EC.element_to_be_clickable((By.ID, "device-type")))
        select = Select(device_type)    # 创建Select对象，用于操作下拉框
        select.select_by_visible_text(devType)

        # 依赖后续输入框的可点击作为页面稳定标志，无需固定 sleep

        # 等待设备型号输入框可点击并输入内容
        model_input = wait.until(EC.element_to_be_clickable((By.ID, 'device-model')))
        try:
            model_input.clear()
            if name is not None:
                model_input.send_keys(name)
        except Exception as e:
            print(f"设备型号输入失败: {e}")
            # 如果清除失败，尝试直接输入，原因：某些输入框对 clear() 不友好但仍可输入
            if name is not None:
                model_input.send_keys(name)

        # 等待设备描述输入框可点击并输入内容
        desc_input = wait.until(EC.element_to_be_clickable((By.ID, 'device-model-desc')))
        try:
            desc_input.clear()
            if desc is not None:
                desc_input.send_keys(desc)
        except Exception as e:
            print(f"设备描述输入失败: {e}")
            # 如果清除失败，尝试直接输入
            if desc is not None:
                desc_input.send_keys(desc)

        # 等待提交按钮可点击并点击
        submit_btn = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '.add-one-submit-btn-div .btn')))
        submit_btn.click()

        # 等待取消按钮可点击并点击
        cancel_btn = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, 'body > main > div.add-one-area > span')))
        cancel_btn.click()

    def get_first_page_device_models(self):
        """
        获取第一页的设备模型信息列表
        list: 包含设备模型信息的列表，每个元素是一个包含三个字段的列表
        """
        # 确保快照元素已出现（短显式等待避免隐式切换）
        try:
            self.wait_short.until(lambda d: len(d.find_elements(By.CSS_SELECTOR, '.field-value')) >= 3)
        except TimeoutException:
            pass
        # 获取当前页面快照
        values = self.wd.find_elements(By.CSS_SELECTOR, '.field-value')
        # 遍历 values 列表，当索引加 1 能被 3 整除时，说明找到了一组完整的设备模型信息
        # （假设每组信息由三个字段组成），将这三个字段的文本内容提取出来，存储在一个列表中，
        # 并添加到 deviceModels 列表中
        deviceModels = []
        for idx, value in enumerate(values):
            if (idx + 1) % 3 == 0:
                deviceModels.append(
                    [values[idx - 2].text, values[idx - 1].text, values[idx].text])
                break  # 只获取第一组后就退出循环

        return deviceModels